package cn.com.pagoda.ideplugin.service;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

/**
 * @author 曾庆苏 on 2023-06-02
 */
public class TimeConversionService {

    public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * 获取当前时间戳,单位-毫秒
     *
     * @return long 毫秒
     */
    public long getUnixTimestamp() {
        return System.currentTimeMillis();
    }

    /**
     * 时间戳转换为当前时区时间
     *
     * @param milli    单位-毫秒
     * @param timeZone 时区id
     * @return LocalDateTime
     */
    public LocalDateTime milli2LocalDateTime(long milli, String timeZone) {
        // 将时间戳转为当前时间
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(milli), TimeZone.getTimeZone(timeZone).toZoneId());
    }

    /**
     * 时间戳转换为当前时区时间
     *
     * @param second   单位-秒
     * @param timeZone 时区id
     * @return LocalDateTime
     */
    public LocalDateTime second2LocalDateTime(long second, String timeZone) {
        // 将时间戳转为当前时间
        return LocalDateTime.ofInstant(Instant.ofEpochSecond(second), TimeZone.getTimeZone(timeZone).toZoneId());
    }

    /**
     * 时区时间转换成时间戳(毫秒)
     *
     * @param localDateTime 时间
     * @param timeZone      时区
     * @return 单位-毫秒
     */
    public long localDateTime2milli(LocalDateTime localDateTime, String timeZone) {
        ZoneOffset offset = TimeZone.getTimeZone(timeZone).toZoneId().getRules().getOffset(localDateTime);
        return localDateTime.toInstant(offset).toEpochMilli();
    }

    /**
     * 时区时间转换成时间戳(秒)
     *
     * @param localDateTime 时间
     * @param timeZone      时区
     * @return 单位-秒
     */
    public long localDateTime2second(LocalDateTime localDateTime, String timeZone) {
        ZoneOffset offset = TimeZone.getTimeZone(timeZone).toZoneId().getRules().getOffset(localDateTime);
        return localDateTime.toEpochSecond(offset);
    }

    /**
     * localDateTime字符串输出
     *
     * @param localDateTime 时间
     * @return 时间字符串
     */
    public String getLocalDateTimeStr(LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ofPattern(DATE_TIME));
    }

    /**
     * 毫秒时间错转换成时间字符串
     *
     * @param milli    毫秒
     * @param timeZone 时区
     * @return 时间字符串
     */
    public String milli2LocalDateTimeStr(long milli, String timeZone) {
        LocalDateTime dateTime = this.milli2LocalDateTime(milli, timeZone);
        return dateTime.format(DateTimeFormatter.ofPattern(DATE_TIME));
    }

    /**
     * 时间字符创准换成毫秒时间戳字符串
     *
     * @param localDateTimeStr 时间字符串
     * @param timeZone         时区
     * @return 毫秒时间戳字符串
     */
    public String localDateTimeStr2Milli(String localDateTimeStr, String timeZone) {
        LocalDateTime parse = LocalDateTime.parse(localDateTimeStr, DateTimeFormatter.ofPattern(DATE_TIME));
        return String.valueOf(this.localDateTime2milli(parse, timeZone));
    }
}
